home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib17.dsk
/
BLACK BOX.bas
next >
Wrap
BASIC Source File
|
2023-02-26
|
10KB
|
254 lines
10 REM **********************
20 REM * BLACK BOX *
30 REM * BY GARY KNOX *
40 REM * COPYRIGHT (C) 1984 *
50 REM * BY MICROSPARC, INC *
60 REM * LINCOLN, MA. 01773 *
70 REM **********************
80 GOSUB 1720
90 DEF FN R(Q) = INT(8 * RND(3)) +1
100 HOME : VTAB 12
110 INPUT "ENTER # OF ATOMS (UP TO 8) ";N
120 IF N < = 0 OR N >8 THEN VTAB 4: PRINT "TRY AGAIN": CALL -958: VTAB 12: GOTO 110
130 DI = INT((N +3)/4)
140 FOR K = 1 TO 8:A(K) = 0:B(K) = 0:: NEXT
150 A(1) = FN R(3):B(1) = FN R(3)
160 FOR K = 2 TO N
170 CX = FN R(3):CY = FN R(3)
180 FOR L = 1 TO K -1
190 IF A(L) = CX AND B(L) = CY THEN 170
200 NEXT L
210 A(K) = CX:B(K) = CY
220 NEXT K
230 HOME
240 REM
250 REM **DRAW THE BLACK BOX**
260 GOSUB 1610
270 VTAB 2: HTAB 15: PRINT "SIDE 1"
280 VTAB 9: PRINT "SIDE 4"
290 VTAB 9: HTAB 29: PRINT "SIDE 2"
300 VTAB 17: HTAB 15: PRINT "SIDE 3"
310 VTAB 18: CALL -958: HTAB 1
320 HTAB 1: VTAB 19: PRINT "POINTS = "PT
330 REM
340 REM **ENTER FIRING POSITION**
350 VTAB 21: INPUT "ENTER SIDE # ";S
360 IF S >4 OR S <0 THEN 310
370 PT = PT - INT(20/DI)
380 VTAB 21: CALL -958: INPUT "ENTER POSITION NUMBER ON THAT SIDE ";P
390 IF P >8 OR P <0 THEN 380
400 INVERSE
410 GOSUB 980: GOSUB 1090: GOSUB 1500
420 PRINT P
430 FF = 0
440 TX = X +XD:TY = Y +YD
450 IF FF = 1 THEN 490
460 FOR K = 1 TO N
470 IF A(K) = TX AND B(K) = TY THEN ZX$ = "ABSORBED": GOTO 750
480 NEXT K
490 RESTORE
500 FOR K = 1 TO S
510 FOR L = 1 TO 4
520 READ CX(L),CY(L)
530 DATA -1,0,1,0,-1,1,1,1,0,-1,0,1,-1,-1,-1,1
540 DATA -1,0,1,0,1,-1,-1,-1,0,-1,0,1, 1, 1, 1,-1
550 NEXT L
560 NEXT K
570 IF FF = 1 THEN 630
580 FF = 1
590 FOR K = 1 TO N
600 IF A(K) = TX +CX(1) AND B(K) = TY +CY(1) THEN ZX$ = "REFLECTED BACK": GOTO 740
610 IF A(K) = TX +CX(2) AND B(K) = TY +CY(2) THEN ZX$ = "REFLECTED BACK": GOTO 740
620 NEXT K
630 FOR K = 1 TO N
640 IF A(K) = TX +XD AND B(K) = TY +YD THEN ZX$ = "ABSORBED": GOTO 750
650 IF A(K) = TX +CX(3) AND B(K) = TY +CY(3) THEN ZX$ = "REFLECTED": GOTO 830
660 IF A(K) = TX +CX(4) AND B(K) = TY +CY(4) THEN ZX$ = "REFLECTED": GOTO 880
670 NEXT K
680 X = TX:Y = TY
690 IF X = 0 OR X = 9 OR Y = 0 OR Y = 9 THEN 710
700 GOTO 440
710 S = (S +2) - INT((S +2)/4) *4
720 IF S = 0 THEN S = 4
730 IF ZX$ = "" THEN ZX$ = "PASSED THROUGH"
740 FLASH : GOSUB 980: PRINT P
750 HTAB 15: VTAB 23: INVERSE : PRINT ZX$:ZX$ = "": FOR ZZ = 1 TO 2000: NEXT ZZ: NORMAL
760 HTAB 1: VTAB 19: CALL -958: PRINT "POINTS = "PT
770 VTAB 22: PRINT "------ ------ -------"
780 VTAB 21: CALL -868: INPUT "Q=QUIT F=FIRE G=GUESS (ENTER CHOICE)";PQ$
790 IF PQ$ = "F" THEN GOSUB 1610: GOTO 310
800 IF PQ$ = "Q" THEN GOSUB 1610: GOTO 1200
810 IF PQ$ = "G" THEN 1250
820 GOTO 780
830 TT = 3: GOSUB 1670
840 GOSUB 1090
850 IF ABS(XD) = 1 THEN P = TY: GOTO 680
860 P = TX
870 GOTO 680
880 TT = 1: GOSUB 1670
890 GOSUB 1090
900 IF ABS(XD) = 1 THEN P = TY: GOTO 680
910 P = TX
920 GOTO 680
930 TT = 2: GOSUB 1670
940 GOSUB 1090
950 GOTO 680
960 REM
970 REM **CALCULATE BOX POSITION**
980 ON S GOTO 990,1010,1030,1050
990 VTAB 5: HTAB (2 *P +8)
1000 GOTO 1060
1010 HTAB 26: VTAB (P +5)
1020 GOTO 1060
1030 VTAB 14: HTAB (2 *P +8)
1040 GOTO 1060
1050 VTAB (P +5): HTAB 8
1060 RETURN
1070 REM
1080 REM **GET MOTION INCREMENTS**
1090 ON S GOTO 1100,1120,1140,1160
1100 XD = 0:YD = 1
1110 GOTO 1170
1120 XD = -1:YD = 0
1130 GOTO 1170
1140 XD = 0:YD = -1
1150 GOTO 1170
1160 XD = 1:YD = 0
1170 RETURN
1180 REM
1190 REM **PRINT ALL ATOMS**
1200 FOR K = 1 TO N
1210 HTAB (2 *A(K) +8): VTAB (B(K) +5): PRINT "*"
1220 NEXT K
1230 VTAB 20: HTAB 1: CALL -958: VTAB 21: PRINT "THIS IS WHERE THE ATOMS WERE!": FOR ZZ = 1 TO 2000: NEXT : GOTO 1440
1240 REM
1250 REM **ENTER GUESS AND CHECK**
1260 VTAB 20: CALL -958
1270 NORMAL : VTAB 21
1280 INPUT "ENTER ROW ";R
1290 PRINT
1300 INPUT "ENTER COLUMN ";C
1310 FOR W9 = 1 TO CO
1320 IF C = C(W9) AND R = D(W9) THEN 1410
1330 NEXT W9
1340 FOR K = 1 TO N
1350 IF A(K) = C AND B(K) = R THEN INVERSE : HTAB 22: VTAB 22: PRINT "CORRECT": FOR EE = 1 TO 3000: NEXT :CO = CO +1:PT = PT + INT(500 *DI): GOTO 1370
1360 GOTO 1390
1370 HTAB (2 *A(K) +8): VTAB (B(K) +5): NORMAL : PRINT "*"
1380 C(CO) = C:D(CO) = R: NORMAL : GOSUB 1610: HTAB 1: VTAB 20: CALL -958: GOTO 1420
1390 NEXT K
1400 INVERSE : HTAB 22: VTAB 22: PRINT "NOT CORRECT": FOR ZZ = 1 TO 3000: NEXT : NORMAL
1410 HTAB 1: VTAB 20: CALL -958: GOSUB 1610:PT = PT -100 *DI: GOTO 760
1420 IF CO < >N THEN 760
1430 VTAB 21: HTAB 1: CALL -958: VTAB 21: PRINT "YOU GUESSED THEM ALL!!"
1440 VTAB 19: PRINT "POINTS = "PT: HTAB 1: VTAB 22
1450 PRINT : INPUT "PLAY ANOTHER GAME? Y OR N ?";A$: IF LEFT$(A$,1) = "Y" THEN CLEAR : GOTO 90
1460 FOR ZZ = 1 TO 1000: NEXT : HOME : END
1470 GOTO 310
1480 REM
1490 REM **GET FIRING COORDINATES**
1500 ON S GOTO 1510,1530,1550,1570
1510 X = P:Y = 0
1520 GOTO 1580
1530 X = 9:Y = P
1540 GOTO 1580
1550 X = P:Y = 9
1560 GOTO 1580
1570 X = 0:Y = P
1580 RETURN
1590 REM
1600 REM **PRINT BOX NUMBERS**
1610 HTAB 10: VTAB 5: FOR X = 1 TO 8: PRINT X" ";: NEXT X: PRINT : VTAB 6
1620 FOR X = 1 TO 8: HTAB 8: PRINT X;: HTAB 26: PRINT X: NEXT X: VTAB 14: HTAB 10
1630 FOR X = 1 TO 8: PRINT X" ";: NEXT X
1640 RETURN
1650 REM
1660 REM **CHANGE DIRECTION**
1670 S = (S +TT) - INT((S +TT)/4) *4
1680 IF S = 0 THEN S = 4
1690 RETURN
1700 REM
1710 REM **DIRECTIONS FOR GAME**
1720 HOME
1730 VTAB 10: HTAB 15: PRINT "BLACK BOX"
1740 VTAB 12: HTAB 19: PRINT "BY"
1750 VTAB 14: HTAB 15: PRINT "GARY KNOX": VTAB 20: PRINT "** COPYRIGHT 1983 BY MICROSPARC, INC. **"
1760 VTAB 24: HTAB 15: INPUT "PUSH RETURN TO GO ON..";PP$
1770 HOME : VTAB 12: INPUT "DIRECTIONS Y=YES N=NO ";PP$
1780 IF LEFT$(PP$,1) = "N" THEN 2440
1790 SPEED= 200: HOME : VTAB 5
1800 PRINT " THE COMPUTER WILL RANDOMLY PLACE": PRINT : HTAB 10: PRINT "ATOMS IN A BLACK BOX."
1810 PRINT : PRINT " YOU MUST GUESS WHERE THEY ARE!"
1820 PRINT : PRINT "YOU MUST FIRE ATOMS INTO THE BOX AND"
1830 PRINT : HTAB 2
1840 PRINT "THE COMPUTER WILL SHOW WHERE THEY"
1850 PRINT : HTAB 16
1860 PRINT "COME OUT."
1870 GOSUB 2460
1880 HOME : VTAB 5: HTAB 5: PRINT "WHEN YOU FIRE AN ATOM INTO THE ": CALL -922: PRINT "BLACK BOX, IT WILL BE...."
1890 CALL -922: HTAB 15: PRINT "ABSORBED": CALL -922: HTAB 15: PRINT "REFLECTED": CALL -922: HTAB 12: PRINT "OR REJECTED."
1900 GOSUB 2460
1910 HOME : PRINT "THE ATOM IS ABSORBED IF YOU FIRE": CALL -922: PRINT "DIRECTLY AT AN ATOM IN THE BOX."
1920 VTAB 5: GOSUB 1610: HTAB 14: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
1930 GOSUB 2470
1940 QQ = 10: GOSUB 2480
1950 FOR K = 1 TO 1000: NEXT
1960 GOSUB 2460
1970 HOME : PRINT "THE ATOM WILL PASS STRAIGHT THROUGH": PRINT "THE BOX IF NO ATOM IS IN THE WAY."
1980 VTAB 5: GOSUB 1610: HTAB 18: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
1990 GOSUB 2470
2000 QQ = 6: GOSUB 2480
2010 VTAB 5: HTAB 14: FLASH : PRINT "3": NORMAL
2020 FOR K = 1 TO 1000: NEXT
2030 GOSUB 2460
2040 HOME : PRINT "THE ATOM YOU FIRE IS REFLECTED": PRINT "TO THE LEFT WHEN IT APPROACHES": PRINT "AN ATOM DIAGONALLY TO ITS RIGHT."
2050 VTAB 5: GOSUB 1610: HTAB 16: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
2060 GOSUB 2470
2070 QQ = 10: GOSUB 2480
2080 QQ = 9:RR = -1:PP = 13: GOSUB 2490
2090 FOR K = 1 TO 1000: NEXT : NORMAL : GOSUB 2460
2100 HOME : PRINT "THE ATOM YOU FIRE IS REFLECTED": PRINT "TO THE RIGHT WHEN IT APPROACHES": PRINT "AN ATOM DIAGONALLY TO ITS LEFT."
2110 VTAB 5: GOSUB 1610: HTAB 12: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
2120 GOSUB 2470
2130 QQ = 10: GOSUB 2480
2140 QQ = 25:RR = 1:PP = 15: GOSUB 2490
2150 FOR K = 1 TO 1000: NEXT : NORMAL : GOSUB 2460
2160 HOME : PRINT "THE ATOM YOU FIRE IS REJECTED": PRINT "IF IT IS AGAINST A WALL AND": PRINT "YOU FIRE INTO THE BOX NEXT TO IT."
2170 VTAB 5: GOSUB 1610: HTAB 12: VTAB 13: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
2180 GOSUB 2470
2190 HTAB 14: VTAB 13: PRINT " ": FOR J = 1 TO 500: NEXT : NORMAL : HTAB 14: VTAB 13: PRINT " ": HTAB 14: VTAB 14: FLASH : PRINT "3"
2200 FOR K = 1 TO 1000: NEXT : NORMAL : GOSUB 2460
2210 HOME : PRINT "WITH MORE THAN ONE ATOM IN THE BOX": PRINT "IT GETS INTERESTING."
2220 VTAB 5: GOSUB 1610: HTAB 12: VTAB 9: PRINT "*": HTAB 22: VTAB 9: PRINT "*": INVERSE : HTAB 14: VTAB 14: PRINT "3"
2230 GOSUB 2470
2240 QQ = 10: GOSUB 2480
2250 QQ = 20:RR = 1:PP = 15: GOSUB 2490
2260 FOR K = 11 TO 13: INVERSE : HTAB 20: VTAB K: PRINT " ": FOR J = 1 TO 500: NEXT : NORMAL : HTAB 20: VTAB K: PRINT " ": NEXT K: FLASH : HTAB 20: VTAB 14: PRINT "6"
2270 FOR K = 1 TO 1000: NEXT K: NORMAL : GOSUB 2460
2280 HOME : VTAB 7
2290 PRINT "WHEN YOU ARE READY TO GUESS WHERE"
2300 PRINT : PRINT "AN ATOM IS HIDDEN...."
2310 PRINT : PRINT "YOU WILL BE ASKED FOR THE ROW NUMBER."
2320 PRINT : PRINT "(HORIZONTAL) ";: SPEED= 100: INVERSE : FOR ZZ = 1 TO 20: PRINT " ";: NEXT : SPEED= 200: NORMAL : PRINT
2330 GOSUB 2460
2340 HOME : VTAB 7: PRINT "THEN YOU WILL BE ASKED FOR..."
2350 PRINT : PRINT "THE COLUMN NUMBER FOR THE HIDDEN ATOM."
2360 PRINT : PRINT "(VERTICAL)";: INVERSE : SPEED= 100: FOR ZZ = 11 TO 20: HTAB 13: VTAB ZZ: PRINT " ": NEXT : SPEED= 200: NORMAL
2370 GOSUB 2460
2380 HOME : VTAB 7: PRINT "THE POINT SYSTEM IS..."
2390 VTAB 10: HTAB 15: PRINT "1-4 ATOMS"; SPC( 5);"5-8 ATOMS"
2400 HTAB 15: PRINT "---------"; SPC( 5);"---------"
2410 PRINT : PRINT "FIRE INTO BOX";: HTAB 19: PRINT -20; SPC( 9); -10: PRINT : PRINT "WRONG GUESS";: HTAB 18: PRINT -100; SPC( 8); -200
2420 PRINT : PRINT "CORRECT GUESS";: HTAB 19: PRINT 500; SPC( 8);1000: GOSUB 2460
2430 HOME : VTAB 10: PRINT "WOULD YOU LIKE TO REPEAT": PRINT : PRINT "THE EXPLANATION? Y OR N";: INPUT A$: IF LEFT$(A$,1) = "Y" THEN 1790
2440 SPEED= 255: RETURN
2450 REM
2460 VTAB 24: HTAB 15: INPUT "PUSH RETURN TO GO ON..";PP$: RETURN
2470 VTAB 20: PRINT "PUSH THE 'F' KEY TO FIRE...";: GET PP$: RETURN
2480 FOR K = 13 TO QQ STEP -1: INVERSE : HTAB 14: VTAB K: PRINT " ": FOR J = 1 TO 250: NEXT J: HTAB 14: VTAB K: NORMAL : PRINT " ": NEXT K: RETURN
2490 FOR K = PP TO QQ STEP RR: HTAB K: VTAB 10: INVERSE : PRINT " ": FOR J = 1 TO 250: NEXT J: NORMAL : HTAB K: VTAB 10: PRINT " ": NEXT K
2500 IF QQ = 20 THEN 2540
2510 IF RR = 1 THEN HTAB 26: GOTO 2530
2520 HTAB 8
2530 VTAB 10: FLASH : PRINT "5"
2540 RETURN